package io.adrainty.bolee.framework.commons.utils;

/**
 * <p>IdentifierNoUtil</p>
 *
 * @author AdRainty
 * @version V1.0.0
 * @description 编号工具类
 * @since 2025/8/7 15:04:43
 */
public class IdentifierNoUtil {

    private IdentifierNoUtil() {
    }

    public static String ROOT_PARENT_ID = "100000000000000";

    /***
     * @description 处理补全编号，所有编号都是15位，共5层，每层关系如下：
     * 第一层：100000000000000
     * 第二层：100001000000000
     * 第三层：100001001000000
     * 第四层：100001001001000
     * 第五层：100001001001001
     * 处理后100000000000000后结果为100
     * @param input 输入编号
     * @return java.lang.String
     */
    public static String processNo(String input) {
        int step = input.length() / 3;
        for (int i = 0; i < step; i++) {
            String targetString = input.substring(input.length() - 3);
            if ("000".equals(targetString)) {
                input = input.substring(0, input.length() - 3);
            } else {
                break;
            }
        }
        return input;
    }

    /***
     * @description 创建编号
     * @param input 输入编号
     * @param peerNode 是否有下属节点
     * @return java.lang.String
     */
    public static String createNo(String input, boolean peerNode) {
        int step = input.length() / 3;
        int supplement = 0;
        for (int i = 0; i < step; i++) {
            String targetString = input.substring(input.length() - 3);
            if ("000".equals(targetString)) {
                input = input.substring(0, input.length() - 3);
                supplement++;
            } else {
                break;
            }
        }

        return peerNode? Long.parseLong(input) + 1L + "000".repeat(Math.max(0, supplement)):
                Long.valueOf(input + "001") + "000".repeat(Math.max(0, supplement - 1));
    }

    /***
     * @description 判断编号是否是父编号
     * @param parentNo 父编号
     * @param sonNo 子编号
     * @return java.lang.Boolean
     */
    public static Boolean isParent(String parentNo, String sonNo) {
        parentNo = processNo(parentNo);
        return sonNo.startsWith(parentNo);
    }

}
